package org.example.cake.controller;
import org.checkerframework.checker.units.qual.A;
import org.example.cake.common.Rep;
import org.example.cake.entity.*;
import org.example.cake.mapper.*;
import org.example.cake.utils.AliOSSUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/upload")
@CrossOrigin(origins = "*")
public class FileController {

    @Autowired
    private AliOSSUtils aliOSSUtils;

    @Autowired
    private ThemecakeMapper themecakeMapper;

    @Autowired
    private CarouselMapper carouselMapper;

    @Autowired
    private FestivalMapper festivalMapper;

    @Autowired
    private CategoryMapper categoryMapper;

    /**
     * 轮播图图片上传接口
     * 专门用于轮播图管理模块的图片上传
     */
    @PostMapping("/carouselImage")
    public Rep uploadCarouselImage(@RequestParam("file") MultipartFile file) {
        Rep rep = new Rep();
        try {
            // 1. 验证文件是否为空
            if (file.isEmpty()) {
                rep.setCode(400);
                rep.setMsgerr("请选择要上传的轮播图文件");
                return rep;
            }

            // 2. 验证文件大小（5MB限制，与前端提示保持一致）
            if (file.getSize() > 5 * 1024 * 1024) {
                rep.setCode(400);
                rep.setMsgerr("文件大小不能超过5MB");
                return rep;
            }

            // 3. 验证文件格式（JPG/PNG）
            String contentType = file.getContentType();
            if (contentType == null || (!"image/jpeg".equals(contentType) && !"image/png".equals(contentType))) {
                rep.setCode(400);
                rep.setMsgerr("请上传JPG或PNG格式的图片");
                return rep;
            }

            // 4. 上传文件到OSS
            String imageUrl = aliOSSUtils.upload(file);
            System.out.println("轮播图新增上传照片:"+imageUrl);
            // 5. 返回成功响应（包含图片URL）
            rep.setCode(200);
            rep.setMsgerr("轮播图上传成功");
            rep.addData("url", imageUrl); // 前端需要通过response.data.url获取图片地址
            rep.setUrl(imageUrl);
        } catch (Exception e) {
            e.printStackTrace();
            rep.setCode(500);
            rep.setMsgerr("轮播图上传失败：" + e.getMessage());
        }
        return rep;
    }

    /**
     * 新增/修改轮播图信息
     * @param id 轮播图id
     * @param title 轮播图标题
     * @param status 状态
     * @return rep对象
     */
    @PostMapping("/carouselHandle")
    public Rep CarouselHandle(
            @RequestParam(value = "id", required = false) Integer id,
            @RequestParam(value = "title", required = false) String title,
            @RequestParam(value = "status", required = false) Integer status,
            @RequestParam(value = "imageUrl", required = false) String imageUrl) {
        Rep rep = new Rep();
        try {
            // 1. 验证参数
            if (id == null && (title == null || title.trim().isEmpty())) {
                rep.setCode(400);
                rep.setMsgerr("新增分类时必须提供轮播图标题");
                return rep;
            }

            // 3. 判断是新增还是更新操作
            if (id == null) {
                // 新增操作
                Carousel carousel = new Carousel();
                carousel.setTitle(title);
                carousel.setStatus(status);
                System.out.println("轮播图里面的新增、修改：");
                System.out.println("imageUrl = " + imageUrl);
                // 如果有 imageUrl，设置它
                if (imageUrl != null && !imageUrl.trim().isEmpty()) {
                    carousel.setImageurl(imageUrl);
                }
                int result=carouselMapper.insert(carousel);
                if (result > 0) {
                    rep.setCode(200);
                    rep.setMsgerr("新增轮播图成功");
                    rep.addData("id", carousel.getId());

                } else {
                    rep.setCode(500);
                    rep.setMsgerr("新增轮播图失败");
                }
            } else {
                // 更新操作
                Carousel selectByPrimaryKey = carouselMapper.selectByPrimaryKey(id);
                if (selectByPrimaryKey == null) {
                    rep.setCode(404);
                    rep.setMsgerr("分类不存在");
                    return rep;
                }

                // 更新非空字段
                if (title != null && !title.trim().isEmpty()) {
                    selectByPrimaryKey.setTitle(title);
                }
                if (status != null) {
                    selectByPrimaryKey.setStatus(status);
                }
                if (imageUrl != null) {
                    selectByPrimaryKey.setImageurl(imageUrl);
                }
                int result=carouselMapper.updateByPrimaryKeySelective(selectByPrimaryKey);
                if (result > 0) {
                    rep.setCode(200);
                    rep.setMsgerr("更新轮播图成功");
                    if (imageUrl != null) {
                        rep.addData("url", imageUrl);
                    }
                } else {
                    rep.setCode(500);
                    rep.setMsgerr("更新轮播图失败");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            rep.setCode(500);
            rep.setMsgerr("操作失败: " + e.getMessage());
        }
        return rep;
    }

    /**
     * 专门用于添加分类的上传分类图片的接口
     * @param file
     * @return
     */
    @PostMapping("/categoryImage")
    public Rep uploadCategoryImage(@RequestParam("file") MultipartFile file) {
        Rep rep = new Rep();
        try {
            if (file.isEmpty()) {
                rep.setCode(400);
                rep.setMsgerr("请选择文件");
                return rep;
            }

            // 验证文件大小 (10MB限制)
            if (file.getSize() > 10 * 1024 * 1024) {
                rep.setCode(400);
                rep.setMsgerr("文件大小不能超过10MB");
                return rep;
            }

            // 上传文件到OSS
            String fileName = aliOSSUtils.upload(file);

            rep.setCode(200);
            rep.addData("url", fileName);
            rep.setMsgerr("上传成功");
        } catch (Exception e) {
            rep.setCode(500);
            rep.setMsgerr("上传失败: " + e.getMessage());
        }
        return rep;
    }



    /**
     * 处理分类的上传和更新操作
     * @author 罗江锦
     * @param id 分类ID（更新时必传，新增时可不传）
     * @param file 分类图标文件
     * @param categoryname 分类名称
     * @param categorydesc 分类描述
     * @return 统一响应格式
     */
    @PostMapping("/categoryHandle")
    public Rep categoryHandle(
            @RequestParam(value = "id", required = false) Integer id,
            @RequestParam(value = "file", required = false) MultipartFile file,
            @RequestParam(value = "categoryname", required = false) String categoryname,
            @RequestParam(value = "categorydesc", required = false) String categorydesc) {

        Rep rep = new Rep();

        try {
            // 1. 验证参数
            if (id == null && (categoryname == null || categoryname.trim().isEmpty())) {
                rep.setCode(400);
                rep.setMsgerr("新增分类时必须提供分类名称");
                return rep;
            }

            // 2. 处理文件上传
            String fileUrl = null;
            if (file != null && !file.isEmpty()) {
                // 验证文件大小 (10MB限制)
                if (file.getSize() > 10 * 1024 * 1024) {
                    rep.setCode(400);
                    rep.setMsgerr("文件大小不能超过10MB");
                    return rep;
                }
                fileUrl = aliOSSUtils.upload(file);
            }

            // 3. 判断是新增还是更新操作
            if (id == null) {
                // 新增操作
                Category category = new Category();
                category.setCategoryname(categoryname);
                category.setCategorydesc(categorydesc);
                if (fileUrl != null) {
                    category.setCategoryicon(fileUrl);
                }

                int result = categoryMapper.insertCategory(category);
                if (result > 0) {
                    rep.setCode(200);
                    rep.setMsgerr("新增分类成功");
                    rep.addData("categoryId", category.getCategoryid());
                    if (fileUrl != null) {
                        rep.addData("url", fileUrl);
                    }
                } else {
                    rep.setCode(500);
                    rep.setMsgerr("新增分类失败");
                }
            } else {
                // 更新操作
                Category existingCategory = categoryMapper.selectByPrimaryKey(id);
                if (existingCategory == null) {
                    rep.setCode(404);
                    rep.setMsgerr("分类不存在");
                    return rep;
                }

                // 更新非空字段
                if (categoryname != null && !categoryname.trim().isEmpty()) {
                    existingCategory.setCategoryname(categoryname);
                }
                if (categorydesc != null) {
                    existingCategory.setCategorydesc(categorydesc);
                }
                if (fileUrl != null) {
                    existingCategory.setCategoryicon(fileUrl);
                }

                int result = categoryMapper.updateByPrimaryKeySelective(existingCategory);
                if (result > 0) {
                    rep.setCode(200);
                    rep.setMsgerr("更新分类成功");
                    if (fileUrl != null) {
                        rep.addData("url", fileUrl);
                    }
                } else {
                    rep.setCode(500);
                    rep.setMsgerr("更新分类失败");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            rep.setCode(500);
            rep.setMsgerr("操作失败: " + e.getMessage());
        }

        return rep;
    }

    // 上传图片
    /**
     * 处理主题的上传和更新操作
     * 当id存在时执行更新操作，id不存在时执行新增操作
     */
    @PostMapping("/themeHandle")
    public Rep themeHandle(@RequestParam(value = "id", required = false) Integer id,
                           @RequestParam("file") MultipartFile file,
                           @RequestParam(value = "themetitle", required = false) String themetitle) {
        Rep rep = new Rep();

        try {
            // 1. 验证文件
            if (file.isEmpty()) {
                rep.setCode(400);
                rep.setMsgerr("请选择文件");
                return rep;
            }

            // 2. 验证文件大小 (10MB限制)
            if (file.getSize() > 10 * 1024 * 1024) {
                rep.setCode(400);
                rep.setMsgerr("文件大小不能超过10MB");
                return rep;
            }

            // 3. 上传文件到 OSS
            String fileName = aliOSSUtils.upload(file);

            // 4. 判断是新增还是更新操作
            if (id == null) {
                // 新增操作
                if (themetitle == null || themetitle.trim().isEmpty()) {
                    rep.setCode(400);
                    rep.setMsgerr("请输入主题名称");
                    return rep;
                }

                Themecake themecake = new Themecake();
                themecake.setThemetitle(themetitle);
                themecake.setThemeurl(fileName);
                themecakeMapper.insert(themecake);
                rep.setMsgerr("新增成功");
            } else {
                // 更新操作
                Themecake existingTheme = themecakeMapper.selectById(id);
                if (existingTheme == null) {
                    rep.setCode(400);
                    rep.setMsgerr("主题不存在");
                    return rep;
                }

                // 更新非空字段
                if (themetitle != null && !themetitle.trim().isEmpty()) {
                    existingTheme.setThemetitle(themetitle);
                }
                existingTheme.setThemeurl(fileName); // 更新图片URL

                themecakeMapper.updateByPrimaryKey(existingTheme);
                rep.setMsgerr("更新成功");
            }

            // 5. 返回成功响应
            rep.setCode(200);
            rep.addData("url", fileName);
        } catch (Exception e) {
            e.printStackTrace();
            rep.setCode(500);
            rep.setMsgerr("操作失败: " + e.getMessage());
        }

        return rep;
    }

    //轮播图管理上传图片
    /**
     * //处理后台轮播图管理上传和修改
     * @author 徐
     * 当id存在时执行更新操作，id不存在时执行新增操作
     * @date 2025-08-04
     */
    @PostMapping("/CarouseHandle")
    public Rep carouseHandle(@RequestParam(value = "id",required = false) Integer id,
                             @RequestParam("file")MultipartFile file,
                             @RequestParam(value = "title",required = false) String title,
                             @RequestParam(value = "status",required = false) Integer status){
        Rep rep=new Rep();
        try {
            //1.验证文件
            if (file.isEmpty()){
                rep.setCode(400);
                rep.setMsgerr("请选择文件");
                return rep;
            }

            //2. 验证文件大小(10MB限制)
            if (file.getSize() > 10 * 1024 *1024){
                rep.setCode(400);
                rep.setMsgerr("文件大小不能超过10MB");
                return rep;
            }

            //3. 上传文件到 OSS
            String fileName = aliOSSUtils.upload(file);

            //4. 判断是新增还是更新操作
            if (id == null){
                //新增操作
                if (title == null || title.trim().isEmpty()){
                    rep.setCode(400);
                    rep.setMsgerr("请输入轮播图主题名称");
                    return rep;
                }
                Carousel carousel = new Carousel();
                carousel.setTitle(title);
                carousel.setImageurl(fileName);
                carousel.setStatus(status);
                carouselMapper.insert(carousel);
                rep.setMsgerr("新增成功");
                rep.setCode(200);
                rep.addData("url", fileName);
            } else {
                //更新操作
                Carousel existingCarousel = carouselMapper.selectById(id);
                if (existingCarousel == null){
                    rep.setCode(400);
                    rep.setMsgerr("轮播图主题不存在");
                    return rep;
                }
                //更新非空字段
                if (title != null && !title.trim().isEmpty()){
                    existingCarousel.setTitle(title);
                }
                existingCarousel.setImageurl(fileName); //更新图片URL
                carouselMapper.updateByPrimaryKey(existingCarousel);
                rep.setMsgerr("更新成功");
            }
            //5. 返回成功响应
            rep.setCode(200);
            rep.addData("url",fileName);
        } catch (Exception e){
            e.printStackTrace();
            rep.setCode(500);
            rep.setMsgerr("操作成功: " +e.getMessage());
        }
        return rep;
    }


    //节日管理上传图片
    /**
     * //处理后台节日活动管理上传和修改
     * @author 徐
     * 当id存在时执行更新操作，id不存在时执行新增操作
     * @date 2025-08-04
     */
    @PostMapping("/FestivalHandle")
    public Rep festivalHandle(@RequestParam(value = "festivalid",required = false) Integer festivalid,
                              @RequestParam("file")MultipartFile file,
                              @RequestParam(value = "festivalname",required = false) String festivalname,
                              @RequestParam(value = "festivalstart",required = false) String festivalstart,
                              @RequestParam(value = "festivalend",required = false) String festivalend){

        Rep rep=new Rep();
        try {
            //1.验证文件
            if (file.isEmpty()){
                rep.setCode(400);
                rep.setMsgerr("请选择文件");
                return rep;
            }

            //2. 验证文件大小(10MB限制)
            if (file.getSize() > 10 * 1024 *1024){
                rep.setCode(400);
                rep.setMsgerr("文件大小不能超过10MB");
                return rep;
            }

            //3. 上传文件到 OSS
            String fileName = aliOSSUtils.upload(file);

            //4. 判断是新增还是更新操作
            if (festivalid == null){
                //新增操作
                if (festivalname == null || festivalname.trim().isEmpty() && festivalstart==null || festivalstart.trim().isEmpty() &&
                        festivalend==null || festivalend.trim().isEmpty()){
                    rep.setCode(400);
                    rep.setMsgerr("请输入活动名称");
                    rep.setMsgerr("请输入活动开始时间");
                    rep.setMsgerr("请输入节日结束时间");
                    return rep;
                }
                Festival festival = new Festival();
                festival.setFestivalname(festivalname);
                festival.setFestivalstart(festivalstart);
                festival.setFestivalend(festivalend);
                festival.setFestivalimg(fileName);
                festivalMapper.insert(festival);
                rep.setMsgerr("新增成功");
            } else {
                //更新操作
                Festival existingFestival = festivalMapper.selectById(festivalid);
                if (existingFestival == null){
                    rep.setCode(400);
                    rep.setMsgerr("节日名称不存在");
                    return rep;
                }
                //更新非空字段
                if (festivalname != null && !festivalname.trim().isEmpty() && festivalstart != null && !festivalstart.trim().isEmpty()
                        && festivalend != null && !festivalend.trim().isEmpty()){
                    existingFestival.setFestivalname(festivalname);
                    existingFestival.setFestivalstart(festivalstart);
                    existingFestival.setFestivalend(festivalend);
                }
                existingFestival.setFestivalimg(fileName); //更新图片URL
                festivalMapper.updateByPrimaryKey(existingFestival);
                rep.setMsgerr("更新成功");
            }
            //5. 返回成功响应
            rep.setCode(200);
            rep.addData("url",fileName);
        } catch (Exception e){
            e.printStackTrace();
            rep.setCode(500);
            rep.setMsgerr("操作成功: " +e.getMessage());
        }
        return rep;
    }



    /**
     * 评论相关内容
     */
    @Autowired
    private DiscussMapper discussMapper;
    /**
     * 评论图片对象
     */
    @Autowired
    private DiscussimgMapper discussimgMapper;
    /**
     * 订单对象
     */
    @Autowired
    private OrdercakeMapper ordercakeMapper;
    /**
     * 新增评论
     * @param orderid 小程序获取的订单id
     * @param discusscontent 评论内容
     * @param files 上传的文件
     * @return rep对象
     */
    @PostMapping("/addDiscuss")
    public Rep addDiscuss(
            @RequestParam String orderid,
            @RequestParam String discusscontent,
            @RequestParam(required = false) MultipartFile[] files
    ) {
        Rep rep = new Rep();
        try {
            // 1. 参数校验
            if (orderid == null) {
                return rep.addData("添加评论状态", "订单ID不能为空");
            }

            if (discusscontent == null) {
                return rep.addData("添加评论状态", "评论内容不能为空");
            }

            int orderId;
            try {
                orderId = Integer.parseInt(orderid);
            } catch (NumberFormatException e) {
                return rep.addData("添加评论状态", "订单ID格式错误");
            }

            // 3. 创建并保存评论
            Discuss discuss = new Discuss();
            discuss.setDiscusscontent(discusscontent);
            discuss.setOrderid(orderId);
            discussMapper.insertDiscuss(discuss);

            int generatedDiscussId = discuss.getDiscussid();
            System.out.println("生成的评论ID: " + generatedDiscussId);

            // 4. 处理图片上传（如果有）
            if (files != null && files.length > 0) {
                List<Discussimg> discussimgs = new ArrayList<>();

                for (MultipartFile file : files) {
                    if (!file.isEmpty()) {
                        try {
                            String imgurl = aliOSSUtils.upload(file);
                            Discussimg discussimg = new Discussimg();
                            discussimg.setImgurl(imgurl);
                            discussimg.setDiscussid(generatedDiscussId);
                            discussimgs.add(discussimg);
                        } catch (Exception e) {
                            throw new RuntimeException("图片上传失败: " + file.getOriginalFilename());
                        }
                    }
                }

                if (!discussimgs.isEmpty()) {
                    discussimgMapper.batchInserts(discussimgs);
                }
            }

            // 5. 更新订单评论状态
            ordercakeMapper.updateOrderDiscussIf(orderId, 1);

            return rep.addData("添加评论状态", "新增评论成功");

        } catch (Exception e) {
            return rep.addData("添加评论状态", "新增评论失败: " + e.getMessage());
        }
    }

    @PostMapping("/addImage")
    @Transactional
    public Rep addImage(
            @RequestParam Integer discussid,
            @RequestParam("file") MultipartFile file) {

        // 1. 验证discussid是否存在
        if (discussMapper.selectById(discussid) == null) {
            System.out.println("discussid不存在 = " + discussid);
            return new Rep().addData("输出","评论ID不存在");
        }

        // 2. 上传图片到OSS
        String imgurl;
        try {
            imgurl = aliOSSUtils.upload(file);
        } catch (Exception e) {

            return new Rep().addData("输出","图片上传失败");
        }

        // 3. 保存图片记录
        Discussimg discussimg = new Discussimg();
        discussimg.setDiscussid(discussid);
        discussimg.setImgurl(imgurl);
        discussimgMapper.insert(discussimg);

        return new Rep().addData("输出","图片上传成功！");
    }
    @Autowired
    private UserMapper userMapper;

    /**
     * 更新用户信息（包含头像上传）
     * @param userid 用户ID
     * @param username 昵称
     * @param userphone 手机号
     * @param userurl 头像文件（可选）
     * @return Rep对象
     */
//    @PostMapping("/updateUserInfo")
//    public Rep updateUserInfo(
//            @RequestParam String userid,
//            @RequestParam String username,
//            @RequestParam String userphone,
//            @RequestParam(required = false) MultipartFile userurl
//    ) {
//        Rep rep = new Rep();
//        try {
//            int uid = Integer.parseInt(userid);
//            System.out.println("这是获取到的uid = " + uid);
//            // 查询用户是否存在
//            User user = userMapper.selectUserByUserId(uid);
//            // 判断
//            if (user == null) {
//                return rep.addData("更新状态", "用户不存在");
//            }
//            // 更新用户基本信息
//            user.setUsername(username);
//            // 在后端的 updateUserInfo 方法中
//            user.setUserphone(userphone != null && !userphone.isEmpty() ? userphone : null);
//            // 处理头像上传（如果有）
//            if (userurl != null && !userurl.isEmpty()) {
//                System.out.println("这是获取到的用户上传的头像："+userurl);
//                // 使用OSS工具上传头像
//                String avatarUrl = aliOSSUtils.upload(userurl);
//                // 更新头像URL
//                user.setUserurl(avatarUrl);
//            }
//            // 保存更新后的用户信息
//            userMapper.updateUser(user);
//            // 返回更新后的用户信息
//            return rep.addData("user", user);
//        } catch (NumberFormatException e) {
//            e.printStackTrace();
//            return rep.addData("更新状态", "用户ID格式错误");
//        } catch (Exception e) {
//            e.printStackTrace();
//            return rep.addData("更新状态", "用户信息更新失败");
//        }
//    }
    /**
     * 更新用户信息（支持单独修改头像/手机号/昵称或组合修改）
     * @param userid 用户ID（必填）
     * @param username 昵称（可选）
     * @param userphone 手机号（可选）
     * @param userurl 头像文件（可选）
     * @return Rep对象
     */
    @PostMapping("/updateUserInfo")
    public Rep updateUserInfo(
            @RequestParam String userid,
            @RequestParam(required = false) String username,
            @RequestParam(required = false) String userphone,
            @RequestParam(required = false) MultipartFile userurl
    ) {
        Rep rep = new Rep();
        try {
            // 1. 验证用户ID
            int uid = Integer.parseInt(userid);
            User user = userMapper.selectUserByUserId(uid);
            if (user == null) {
                rep.setCode(404);
                return rep.addData("message", "用户不存在");
            }

            // 2. 记录原始值（用于回滚）
            String originalName = user.getUsername();
            String originalPhone = user.getUserphone();
            String originalAvatar = user.getUserurl();

            // 3. 按需更新字段
            boolean isUpdated = false;

            // 3.1 更新昵称（如果提供了新值）
            if (username != null && !username.trim().isEmpty()) {
                user.setUsername(username.trim());
                isUpdated = true;
            }

            // 3.2 更新手机号（如果提供了新值）
            if (userphone != null && !userphone.trim().isEmpty()) {
                // 可添加手机号格式验证
                if (!userphone.matches("^1[3-9]\\d{9}$")) {
                    rep.setCode(400);
                    return rep.addData("message", "手机号格式错误");
                }
                user.setUserphone(userphone.trim());
                isUpdated = true;
            }

            // 3.3 更新头像（如果上传了新文件）
            if (userurl != null && !userurl.isEmpty()) {
                try {
                    String avatarUrl = aliOSSUtils.upload(userurl);

                    user.setUserurl(avatarUrl);
                    isUpdated = true;
                } catch (Exception e) {
                    // 头像上传失败时恢复其他字段
                    user.setUsername(originalName);
                    user.setUserphone(originalPhone);
                    rep.setCode(500);
                    return rep.addData("message", "头像上传失败");
                }
            }

            // 4. 如果没有实际更新
            if (!isUpdated) {
                rep.setCode(400);
                return rep.addData("message", "未提供有效更新内容");
            }

            // 5. 执行更新
            int result = userMapper.updateUser(user);
            if (result <= 0) {
                // 数据库更新失败时恢复旧值
                user.setUsername(originalName);
                user.setUserphone(originalPhone);
                user.setUserurl(originalAvatar);
                rep.setCode(500);
                return rep.addData("message", "数据库更新失败");
            }
            rep.setCode(200);
            // 6. 返回成功响应
            return rep
                    .addData("user", user)
                    .addData("message", "更新成功");

        } catch (NumberFormatException e) {
            rep.setCode(400);
            return rep.addData("message", "用户ID格式错误");
        } catch (Exception e) {
            e.printStackTrace();
            rep.setCode(500);
            return rep.addData("message", "服务器内部错误");
        }
    }
}

